package main

import (
	"context"
	"encoding/json"
	"github.com/go-redis/redis/v8"
	"go.uber.org/zap"
	"sheep_script/core"
	"sheep_script/global"
	"sheep_script/initialize"
	"sheep_script/scripts/sms/ali"
	"time"
)

const (
	ListSmsSendVerifyCode = "list_sms_send_verify_code" // 发送验证码队列
)

func init() {
	initialize.InitConfig()
	global.Logger = core.InitLogger()
	initialize.InitRedis()
}

type SmsVerify struct {
	Phone string
	Code  string
}

// 异步发送短信脚本
func main() {
	// 创建用于接收队列元素的 channel
	resultChan := make(chan string)
	// 启动一个 goroutine 来监听 Redis 队列
	go listenRedisQueue(context.Background(), global.Redis, ListSmsSendVerifyCode, resultChan)

	// 从 channel 中接收元素并处理
	for {
		select {
		case item := <-resultChan:
			// 在这里可以对获取到的元素进行进一步处理
			var smsVerify SmsVerify
			err := json.Unmarshal([]byte(item), &smsVerify)
			if err != nil {
				global.Logger.Error("redis-dataFormat-fail:", zap.Error(err))
				continue
			}
			// 发送短信
			err = ali.SendVerifyCode(smsVerify.Phone, smsVerify.Code)
			if err != nil {
				global.Logger.Error("send sms error:", zap.Error(err))
				return
			}
		}
	}
}

// 监听 Redis 队列的函数
func listenRedisQueue(ctx context.Context, client *redis.Client, queueName string, resultChan chan string) {
	for {
		// 使用 BLPOP 命令阻塞式地从队列中获取元素
		result, err := client.BLPop(ctx, 0, queueName).Result()
		if err != nil {
			// 处理错误
			global.Logger.Error("Error popping from Redis queue:", zap.Error(err))
			time.Sleep(2 * time.Second) // 等待一段时间后重试
			continue
		}
		// 将获取到的元素发送到 channel 中
		resultChan <- result[1]
	}
}
